import { replaceHtml } from '../utils/util'
import formula from '../global/formula'
import { isRealNum, isRealNull } from '../global/validate'
import { isdatetime, diff } from '../global/datecontroll'
import { luckysheetrefreshgrid } from '../global/refresh'
import tooltip from '../global/tooltip'
import { setcellvalue } from '../global/setdata'
import { getcellvalue } from '../global/getdata'
import editor from '../global/editor'
import { modelHTML } from './constant'
import { selectionCopyShow } from './select'
import server from './server'
import menuButton from './menuButton'
import sheetmanage from './sheetmanage'
import { getSheetIndex, getRangetxt } from '../methods/get'
import locale from '../locale/locale'
import Store from '../store'

const dataVerificationCtrl = {
    defaultItem: {
        type: 'dropdown',  //类型
        type2: null,  //
        value1: '',  //
        value2: '',  //
        checked: false,
        remote: false,  //自动远程获取选项
        prohibitInput: false,  //输入数据无效时禁止输入
        hintShow: false,  //选中单元格时显示提示语
        hintText: '',  //
    },
    curItem: null,
    dataVerification: null,
    selectRange: [],
    selectStatus: false,
    optionLabel: {
        'number': '数值',
        'number_integer': '整数',
        'number_decimal': '小数',
        'bw': '介于',
        'nb': '不介于',
        'eq': '等于',
        'ne': '不等于',
        'gt': '大于',
        'lt': '小于',
        'gte': '大于等于',
        'lte': '小于等于',
        'include': '包括',
        'exclude': '不包括',
        'equal': '等于',
        'bf': '早于',
        'nbf': '不早于',
        'af': '晚于',
        'naf': '不晚于',
        'card': '身份证号码',
        'phone': '手机号'
    },
    optionLabel_en: {
        'number': 'numeric',
        'number_integer': 'integer',
        'number_decimal': 'decimal',
        'bw': 'between',
        'nb': 'not between',
        'eq': 'equal to',
        'ne': 'not equal to',
        'gt': 'greater',
        'lt': 'less than',
        'gte': 'greater or equal to',
        'lte': 'less than or equal to',
        'include': 'include',
        'exclude': 'not include',
        'equal': 'equal to',
        'bf': 'earlier than',
        'nbf': 'not earlier than',
        'af': 'later than',
        'naf': 'not later than',
        'card': 'identification number',
        'phone': 'phone number'
    },
    createDialog: function () {
        let _this = this

        const _locale = locale()
        const dvText = _locale.dataVerification
        const toolbarText = _locale.toolbar
        const buttonText = _locale.button

        $("#luckysheet-modal-dialog-mask").show()
        $("#luckysheet-dataVerification-dialog").remove()

        let content = `<div class="box">
                            <div class="box-item" style="border-top:1px solid #E1E4E8;">
                                <div class="box-item-title">${dvText.cellRange}</div>
                                <div id="data-verification-range" class="range">
                                    <input class="formulaInputFocus" spellcheck="false">
                                    <i class="fa fa-table" aria-hidden="true" title="${dvText.selectCellRange}"></i>
                                </div>
                            </div>
                            <div class="box-item">
                                <div class="box-item-title">${dvText.verificationCondition}</div>
                                <select id="data-verification-type-select">
                                    <option value="dropdown">${dvText.dropdown}</option>
                                    <option value="checkbox">${dvText.checkbox}</option>
                                    <option value="number">${dvText.number}</option>
                                    <option value="number_integer">${dvText.number_integer}</option>
                                    <option value="number_decimal">${dvText.number_decimal}</option>
                                    <option value="text_content">${dvText.text_content}</option>
                                    <option value="text_length">${dvText.text_length}</option>
                                    <option value="date">${dvText.date}</option>
                                    <option value="validity">${dvText.validity}</option>
                                </select>
                                <div class="show-box">
                                    <div class="show-box-item show-box-item-dropdown">
                                        <div class="range">
                                            <input class="formulaInputFocus data-verification-value1" placeholder="${dvText.placeholder1}" spellcheck="false">
                                            <i class="fa fa-table" aria-hidden="true" title="${dvText.selectCellRange}"></i>
                                        </div>
                                        <div class="multi">
                                            <input type="checkbox" id="data-verification-multi" class="data-verification-multi">
                                            <label for="data-verification-multi">${dvText.allowMultiSelect}</label>
                                        </div>
                                    </div>
                                    <div class="show-box-item show-box-item-checkbox">
                                        <div class="check-box">
                                            <span>${dvText.selected} ——</span>
                                            <input type="text" class="data-verification-value1" placeholder="${dvText.placeholder2}">
                                        </div>
                                        <div class="check-box">
                                            <span>${dvText.notSelected} ——</span>
                                            <input type="text" class="data-verification-value2" placeholder="${dvText.placeholder2}">
                                        </div>
                                    </div>
                                    <div class="show-box-item show-box-item-number">
                                        <select id="data-verification-number-select">
                                            <option value="bw">${dvText.between}</option>
                                            <option value="nb">${dvText.notBetween}</option>
                                            <option value="eq">${dvText.equal}</option>
                                            <option value="ne">${dvText.notEqualTo}</option>
                                            <option value="gt">${dvText.moreThanThe}</option>
                                            <option value="lt">${dvText.lessThan}</option>
                                            <option value="gte">${dvText.greaterOrEqualTo}</option>
                                            <option value="lte">${dvText.lessThanOrEqualTo}</option>
                                        </select>
                                        <div class="input input1">
                                            <input type="number" class="data-verification-value1" placeholder="1">
                                            <span>-</span>
                                            <input type="number" class="data-verification-value2" placeholder="100">
                                        </div>
                                        <div class="input input2">
                                            <input type="number" class="data-verification-value1" placeholder="${dvText.placeholder3}">
                                        </div>
                                    </div>
                                    <div class="show-box-item show-box-item-text">
                                        <select id="data-verification-text-select">
                                            <option value="include">${dvText.include}</option>
                                            <option value="exclude">${dvText.exclude}</option>
                                            <option value="equal">${dvText.equal}</option>
                                        </select>
                                        <div class="input input2">
                                            <input type="text" class="data-verification-value1" placeholder="${dvText.placeholder4}"/>
                                        </div>
                                    </div>
                                    <div class="show-box-item show-box-item-textLength">
                                        <select id="data-verification-textLength-select">
                                            <option value="bw">${dvText.between}</option>
                                            <option value="nb">${dvText.notBetween}</option>
                                            <option value="eq">${dvText.equal}</option>
                                            <option value="ne">${dvText.notEqualTo}</option>
                                            <option value="gt">${dvText.moreThanThe}</option>
                                            <option value="lt">${dvText.lessThan}</option>
                                            <option value="gte">${dvText.greaterOrEqualTo}</option>
                                            <option value="lte">${dvText.lessThanOrEqualTo}</option>
                                        </select>
                                        <div class="input input1">
                                            <input type="number" class="data-verification-value1" placeholder="1">
                                            <span>-</span>
                                            <input type="number" class="data-verification-value2" placeholder="100">
                                        </div>
                                        <div class="input input2">
                                            <input type="number" class="data-verification-value1" placeholder="${dvText.placeholder3}">
                                        </div>
                                    </div>
                                    <div class="show-box-item show-box-item-date">
                                        <select id="data-verification-date-select">
                                            <option value="bw">${dvText.between}</option>
                                            <option value="nb">${dvText.notBetween}</option>
                                            <option value="eq">${dvText.equal}</option>
                                            <option value="ne">${dvText.notEqualTo}</option>
                                            <option value="bf">${dvText.earlierThan}</option>
                                            <option value="nbf">${dvText.noEarlierThan}</option>
                                            <option value="af">${dvText.laterThan}</option>
                                            <option value="naf">${dvText.noLaterThan}</option>
                                        </select>
                                        <div class="input input1">
                                            <input type="date" class="data-verification-value1" placeholder="2020/9/10">
                                            <span>-</span>
                                            <input type="date" class="data-verification-value2" placeholder="2020/9/10">
                                        </div>
                                        <div class="input input2">
                                            <input type="date" class="data-verification-value1" placeholder="2020/9/10">
                                        </div>
                                    </div>
                                    <div class="show-box-item show-box-item-validity">
                                        <select id="data-verification-validity-select">
                                            <option value="card">${dvText.identificationNumber}</option>
                                            <option value="phone">${dvText.phoneNumber}</option>
                                        </select>
                                    </div>
                                </div>
                            </div>
                            <div class="box-item">
                                <div class="check">
                                    <input type="checkbox" id="data-verification-remote" class="data-verification-remote">
                                    <label for="data-verification-remote">${dvText.remote}</label>
                                </div>
                                <div class="check">
                                    <input type="checkbox" id="data-verification-prohibitInput">
                                    <label for="data-verification-prohibitInput">${dvText.prohibitInput}</label>
                                </div>
                                <div class="check">
                                    <input type="checkbox" id="data-verification-hint-show">
                                    <label for="data-verification-hint-show">${dvText.hintShow}</label>
                                </div>
                                <div class="data-verification-hint-text">
                                    <input type="text" placeholder="${dvText.placeholder5}">
                                </div>
                            </div>
                        </div>`

        $("body").append(replaceHtml(modelHTML, {
            "id": "luckysheet-dataVerification-dialog",
            "addclass": "luckysheet-dataVerification-dialog",
            "title": toolbarText.dataVerification,
            "content": content,
            "botton": `<button id="luckysheet-dataVerification-dialog-confirm" class="btn btn-primary">${buttonText.confirm}</button>
                        <button id="luckysheet-dataVerification-dialog-delete" class="btn btn-default">${dvText.deleteVerification}</button>
                        <button class="btn btn-default luckysheet-model-close-btn">${buttonText.cancel}</button>`,
            "style": "z-index:100003"
        }))
        let $t = $("#luckysheet-dataVerification-dialog").find(".luckysheet-modal-dialog-content").css("min-width", 350).end(),
            myh = $t.outerHeight(),
            myw = $t.outerWidth()
        let winw = $(window).width(),
            winh = $(window).height()
        let scrollLeft = $(document).scrollLeft(),
            scrollTop = $(document).scrollTop()
        $("#luckysheet-dataVerification-dialog").css({
            "left": (winw + scrollLeft - myw) / 2,
            "top": (winh + scrollTop - myh) / 3
        }).show()

        _this.dataAllocation()
    },
    init: function () {
        let _this = this

        const dvText = locale().dataVerification

        //单元格数据验证 类型是 下拉列表
        $(document).off("click.dropdownBtn").on("click.dropdownBtn", "#luckysheet-dataVerification-dropdown-btn", function (e) {
            _this.dropdownListShow()
            e.stopPropagation()
        })
        $(document).off("click.dropdownListItem").on("click.dropdownListItem", "#luckysheet-dataVerification-dropdown-List .dropdown-List-item", function (e) {
            var $item = $(this)
            let value = e.target.innerText
            if ($item.hasClass('multi')) {
                $item.toggleClass('checked')
                value = $.map($("#luckysheet-dataVerification-dropdown-List").children().filter('.checked'), function (el) {
                    return el.innerText
                }).join(',')
            } else {
                $("#luckysheet-dataVerification-dropdown-List").hide()
            }
            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]
            let rowIndex = last.row_focus
            let colIndex = last.column_focus

            $("#luckysheet-rich-text-editor").text(value)
            formula.updatecell(rowIndex, colIndex)

            e.stopPropagation()
        })

        //单元格范围
        $(document).off("click.dvRange").on("click.dvRange", "#data-verification-range .fa-table", function (e) {
            $("#luckysheet-dataVerification-dialog").hide()

            let dataSource = "0"
            let txt = $(this).siblings("input").val().trim()

            _this.rangeDialog(dataSource, txt)

            _this.selectRange = []

            let range = _this.getRangeByTxt(txt)

            formula.rangetosheet = Store.currentSheetIndex

            if (range[0].sheetIndex != Store.currentSheetIndex) {
                sheetmanage.changeSheetExec(range[0].sheetIndex)
            }

            if (range.length > 0) {
                for (let s = 0; s < range.length; s++) {
                    let r1 = range[s].row[0], r2 = range[s].row[1]
                    let c1 = range[s].column[0], c2 = range[s].column[1]

                    let row = Store.visibledatarow[r2],
                        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1]
                    let col = Store.visibledatacolumn[c2],
                        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1]

                    _this.selectRange.push({
                        "left": col_pre,
                        "width": col - col_pre - 1,
                        "top": row_pre,
                        "height": row - row_pre - 1,
                        "left_move": col_pre,
                        "width_move": col - col_pre - 1,
                        "top_move": row_pre,
                        "height_move": row - row_pre - 1,
                        "row": [r1, r2],
                        "column": [c1, c2],
                        "row_focus": r1,
                        "column_focus": c1
                    })
                }
            }

            selectionCopyShow(_this.selectRange)
        })
        $(document).off("click.dvRange2").on("click.dvRange2", "#luckysheet-dataVerification-dialog .show-box-item-dropdown .range .fa-table", function (e) {
            $("#luckysheet-dataVerification-dialog").hide()

            let dataSource = "1"
            let txt = $(this).siblings("input").val().trim()

            _this.rangeDialog(dataSource, txt)

            _this.selectRange = []

            let range = _this.getRangeByTxt(txt)

            formula.rangetosheet = Store.currentSheetIndex

            if (range[0].sheetIndex != Store.currentSheetIndex) {
                sheetmanage.changeSheetExec(range[0].sheetIndex)
            }

            if (range.length > 0) {
                for (let s = 0; s < range.length; s++) {
                    let r1 = range[s].row[0], r2 = range[s].row[1]
                    let c1 = range[s].column[0], c2 = range[s].column[1]

                    let row = Store.visibledatarow[r2],
                        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1]
                    let col = Store.visibledatacolumn[c2],
                        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1]

                    _this.selectRange.push({
                        "left": col_pre,
                        "width": col - col_pre - 1,
                        "top": row_pre,
                        "height": row - row_pre - 1,
                        "left_move": col_pre,
                        "width_move": col - col_pre - 1,
                        "top_move": row_pre,
                        "height_move": row - row_pre - 1,
                        "row": [r1, r2],
                        "column": [c1, c2],
                        "row_focus": r1,
                        "column_focus": c1
                    })
                }
            }

            selectionCopyShow(_this.selectRange)
        })
        $(document).off("click.dvRangeConfirm").on("click.dvRangeConfirm", "#luckysheet-dataVerificationRange-dialog-confirm", function (e) {
            let dataSource = $(this).attr("data-source")
            let txt = $(this).parents("#luckysheet-dataVerificationRange-dialog").find("input").val()

            if (_this.getRangeByTxt(txt).length > 1) {
                tooltip.info('<i class="fa fa-exclamation-triangle"></i>', '不能对多重选择区域执行此操作，请选择单个区域，然后再试')
                return
            }

            if (dataSource == '0') {
                $("#luckysheet-dataVerification-dialog #data-verification-range input").val(txt)
            }
            else if (dataSource == '1') {
                $("#luckysheet-dataVerification-dialog .show-box-item-dropdown .range input").val(txt)
            }

            $("#luckysheet-dataVerificationRange-dialog").hide()
            $("#luckysheet-modal-dialog-mask").show()
            $("#luckysheet-dataVerification-dialog").show()

            if (formula.rangetosheet != null && formula.rangetosheet != Store.currentSheetIndex) {
                sheetmanage.changeSheetExec(formula.rangetosheet)
                formula.rangetosheet = null
            }

            let range = []
            selectionCopyShow(range)
        })
        $(document).off("click.dvRangeClose").on("click.dvRangeClose", "#luckysheet-dataVerificationRange-dialog-close", function (e) {
            $("#luckysheet-dataVerificationRange-dialog").hide()
            $("#luckysheet-modal-dialog-mask").show()
            $("#luckysheet-dataVerification-dialog").show()

            if (formula.rangetosheet != null && formula.rangetosheet != Store.currentSheetIndex) {
                sheetmanage.changeSheetExec(formula.rangetosheet)
                formula.rangetosheet = null
            }

            let range = []
            selectionCopyShow(range)
        })
        $(document).on("click", "#luckysheet-dataVerificationRange-dialog .luckysheet-modal-dialog-title-close", function (e) {
            $("#luckysheet-dataVerificationRange-dialog").hide()
            $("#luckysheet-modal-dialog-mask").show()
            $("#luckysheet-dataVerification-dialog").show()

            if (formula.rangetosheet != null && formula.rangetosheet != Store.currentSheetIndex) {
                sheetmanage.changeSheetExec(formula.rangetosheet)
                formula.rangetosheet = null
            }

            let range = []
            selectionCopyShow(range)
        })

        //验证条件 下拉框
        $(document).off("change.typeSelect").on("change.typeSelect", "#data-verification-type-select", function (e) {
            $("#luckysheet-dataVerification-dialog .show-box .show-box-item").hide()

            let value = this.value
            let item = _this.curItem

            if (value == 'dropdown') {
                $("#luckysheet-dataVerification-dialog .show-box .show-box-item-dropdown").show()

                let value1 = ""

                if (value == item.type) {
                    value1 = item.value1
                }

                $("#luckysheet-dataVerification-dialog .show-box-item-dropdown .data-verification-value1").val(value1)

                $('#luckysheet-dataVerification-dialog #data-verification-multi').prop('checked', item.type2 ? true : false)
            }
            else if (value == 'checkbox') {
                $("#luckysheet-dataVerification-dialog .show-box .show-box-item-checkbox").show()

                let value1 = ""
                let value2 = ""

                if (value == item.type) {
                    value1 = item.value1
                    value2 = item.value2
                }

                $("#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value1").val(value1)
                $("#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value2").val(value2)
            }
            else if (value == 'number' || value == 'number_integer' || value == 'number_decimal') {
                $("#luckysheet-dataVerification-dialog .show-box-item-number").show()
                $("#luckysheet-dataVerification-dialog .show-box-item-number .input").hide()

                let type2 = "bw"
                let value1 = ""
                let value2 = ""

                if (item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal') {
                    type2 = item.type2
                    value1 = item.value1
                    value2 = item.value2
                }

                $("#luckysheet-dataVerification-dialog #data-verification-number-select").val(type2)

                if (type2 == 'bw' || type2 == 'nb') {
                    $("#luckysheet-dataVerification-dialog .show-box-item-number .input1").show()
                }
                else {
                    $("#luckysheet-dataVerification-dialog .show-box-item-number .input2").show()
                }

                $("#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value1").val(value1)
                $("#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value2").val(value2)
            }
            else if (value == 'text_content') {
                $("#luckysheet-dataVerification-dialog .show-box-item-text").show()

                let type2 = "include"
                let value1 = ""

                if (value == item.type) {
                    type2 = item.type2
                    value1 = item.value1
                }

                $("#luckysheet-dataVerification-dialog #data-verification-text-select").val(type2)
                $("#luckysheet-dataVerification-dialog .show-box-item-text .data-verification-value1").val(value1)
            }
            else if (value == 'text_length') {
                $("#luckysheet-dataVerification-dialog .show-box-item-textLength").show()
                $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input").hide()

                let type2 = "bw"
                let value1 = ""
                let value2 = ""

                if (value == item.type) {
                    type2 = item.type2
                    value1 = item.value1
                    value2 = item.value2
                }

                $("#luckysheet-dataVerification-dialog #data-verification-textLength-select").val(type2)

                if (type2 == 'bw' || type2 == 'nb') {
                    $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input1").show()
                }
                else {
                    $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input2").show()
                }

                $("#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value1").val(value1)
                $("#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value2").val(value2)
            }
            else if (value == 'date') {
                $("#luckysheet-dataVerification-dialog .show-box-item-date").show()
                $("#luckysheet-dataVerification-dialog .show-box-item-date .input").hide()

                let type2 = "bw"
                let value1 = ""
                let value2 = ""

                if (value == item.type) {
                    type2 = item.type2
                    value1 = item.value1
                    value2 = item.value2
                }

                $("#luckysheet-dataVerification-dialog #data-verification-date-select").val(type2)

                if (type2 == 'bw' || type2 == 'nb') {
                    $("#luckysheet-dataVerification-dialog .show-box-item-date .input1").show()
                }
                else {
                    $("#luckysheet-dataVerification-dialog .show-box-item-date .input2").show()
                }

                $("#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value1").val(value1)
                $("#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value2").val(value2)
            }
            else if (value == 'validity') {
                $("#luckysheet-dataVerification-dialog .show-box .show-box-item-validity").show()

                let type2 = "card"

                if (value == item.type) {
                    type2 = item.type2
                }

                $("#luckysheet-dataVerification-dialog #data-verification-validity-select").val(type2)
            }
        })

        $(document).off("change.numberSelect").on("change.numberSelect", "#data-verification-number-select", function (e) {
            $("#luckysheet-dataVerification-dialog .show-box-item-number .input").hide()

            let value = this.value

            if (value == 'bw' || value == 'nb') {
                $("#luckysheet-dataVerification-dialog .show-box-item-number .input1").show()
            }
            else {
                $("#luckysheet-dataVerification-dialog .show-box-item-number .input2").show()
            }
        })
        // 文本长度选择变化
        $(document).off("change.textLengthSelect").on("change.textLengthSelect", "#data-verification-textLength-select", function (e) {
            $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input").hide()

            let value = this.value

            if (value == 'bw' || value == 'nb') {
                $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input1").show()
            }
            else {
                $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input2").show()
            }
        })

        $(document).off("change.dateSelect").on("change.dateSelect", "#data-verification-date-select", function (e) {
            $("#luckysheet-dataVerification-dialog .show-box-item-date .input").hide()

            let value = this.value

            if (value == 'bw' || value == 'nb') {
                $("#luckysheet-dataVerification-dialog .show-box-item-date .input1").show()
            }
            else {
                $("#luckysheet-dataVerification-dialog .show-box-item-date .input2").show()
            }
        })

        //选中单元格时显示提示语
        $(document).off("change.hintShow").on("change.hintShow", "#data-verification-hint-show", function (e) {
            if (this.checked) {
                $("#luckysheet-dataVerification-dialog .data-verification-hint-text").show()
            }
            else {
                $("#luckysheet-dataVerification-dialog .data-verification-hint-text").hide()
            }
        })

        //确认按钮
        $(document).off("click.dvSaveConfirm").on("click.dvSaveConfirm", "#luckysheet-dataVerification-dialog-confirm", function (e) {
            let rangeTxt = $("#luckysheet-dataVerification-dialog #data-verification-range input").val().trim()
            let range = _this.getRangeByTxt(rangeTxt)

            if (range.length == 0) {
                tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.selectCellRange2)
                return
            }

            let str = range[range.length - 1].row[0],
                edr = range[range.length - 1].row[1],
                stc = range[range.length - 1].column[0],
                edc = range[range.length - 1].column[1]
            let d = editor.deepCopyFlowData(Store.flowdata)

            if (str < 0) {
                str = 0
            }

            if (edr > d.length - 1) {
                edr = d.length - 1
            }

            if (stc < 0) {
                stc = 0
            }

            if (edc > d[0].length - 1) {
                edc = d[0].length - 1
            }

            let type = $("#luckysheet-dataVerification-dialog #data-verification-type-select").val()
            let type2 = null, value1 = "", value2 = ""

            if (type == 'dropdown') {
                value1 = $("#luckysheet-dataVerification-dialog .show-box-item-dropdown .data-verification-value1").val().trim()

                if (value1.length == 0) {
                    tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo1)
                    return
                }
                type2 = $("#luckysheet-dataVerification-dialog #data-verification-multi").is(':checked')
            }
            else if (type == 'checkbox') {
                value1 = $("#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value1").val().trim()
                value2 = $("#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value2").val().trim()

                if (value1.length == 0 || value2.length == 0) {
                    tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo2)
                    return
                }
            }
            else if (type == 'number' || type == 'number_integer' || type == 'number_decimal') {
                type2 = $("#luckysheet-dataVerification-dialog #data-verification-number-select").val()
                value1 = $("#luckysheet-dataVerification-dialog .show-box-item-number .input:visible .data-verification-value1").val().trim()

                if (!isRealNum(value1)) {
                    tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo3)
                    return
                }

                if (type2 == 'bw' || type2 == 'nb') {
                    value2 = $("#luckysheet-dataVerification-dialog .show-box-item-number .input:visible .data-verification-value2").val().trim()

                    if (!isRealNum(value2)) {
                        tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo3)
                        return
                    }

                    if (Number(value2) < Number(value1)) {
                        tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo4)
                        return
                    }
                }
            }
            else if (type == 'text_content') {
                type2 = $("#luckysheet-dataVerification-dialog #data-verification-text-select").val()
                value1 = $("#luckysheet-dataVerification-dialog .show-box-item-text .data-verification-value1").val().trim()

                if (value1.length == 0) {
                    tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo5)
                    return
                }
            }
            else if (type == 'text_length') {
                type2 = $("#luckysheet-dataVerification-dialog #data-verification-textLength-select").val()
                value1 = $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input:visible .data-verification-value1").val().trim()

                if (!isRealNum(value1)) {
                    tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo3)
                    return
                }

                if (!Number.isInteger(Number(value1)) || Number(value1) < 0) {
                    tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.textlengthInteger)
                    return
                }

                if (type2 == 'bw' || type2 == 'nb') {
                    value2 = $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input:visible .data-verification-value2").val().trim()

                    if (!isRealNum(value2)) {
                        tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo3)
                        return
                    }
                    if (!Number.isInteger(Number(value2)) || Number(value2) < 0) {
                        tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.textlengthInteger)
                        return
                    }

                    if (Number(value2) < Number(value1)) {
                        tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo4)
                        return
                    }
                }
            }
            else if (type == 'date') {
                type2 = $("#luckysheet-dataVerification-dialog #data-verification-date-select").val()
                value1 = $("#luckysheet-dataVerification-dialog .show-box-item-date .input:visible .data-verification-value1").val().trim()

                if (!isdatetime(value1)) {
                    tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo6)
                    return
                }

                if (type2 == 'bw' || type2 == 'nb') {
                    value2 = $("#luckysheet-dataVerification-dialog .show-box-item-date .input:visible .data-verification-value2").val().trim()

                    if (!isdatetime(value2)) {
                        tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo6)
                        return
                    }

                    if (diff(value1, value2) > 0) {
                        tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.tooltipInfo7)
                        return
                    }
                }
            }
            else if (type == 'validity') {
                type2 = $("#luckysheet-dataVerification-dialog #data-verification-validity-select").val()
            }

            let remote = $("#luckysheet-dataVerification-dialog #data-verification-remote").is(":checked")
            let prohibitInput = $("#luckysheet-dataVerification-dialog #data-verification-prohibitInput").is(":checked")
            let hintShow = $("#luckysheet-dataVerification-dialog #data-verification-hint-show").is(":checked")
            let hintText = ""

            if (hintShow) {
                hintText = $("#luckysheet-dataVerification-dialog .data-verification-hint-text input").val().trim()
            }

            let item = {
                type: type,
                type2: type2,
                value1: value1,
                value2: value2,
                checked: false,
                remote: remote,
                prohibitInput: prohibitInput,
                hintShow: hintShow,
                hintText: hintText,
            }

            let historyDataVerification = $.extend(true, {}, _this.dataVerification)
            let currentDataVerification = $.extend(true, {}, _this.dataVerification)

            for (let r = str; r <= edr; r++) {
                for (let c = stc; c <= edc; c++) {
                    currentDataVerification[r + '_' + c] = item

                    if (type == 'checkbox') {
                        setcellvalue(r, c, d, item.value2)
                    }
                }
            }

            if (type == 'checkbox') {
                _this.refOfCheckbox(historyDataVerification, currentDataVerification, Store.currentSheetIndex, d, range[range.length - 1])
            }
            else {
                _this.ref(historyDataVerification, currentDataVerification, Store.currentSheetIndex)
            }

            $("#luckysheet-modal-dialog-mask").hide()
            $("#luckysheet-dataVerification-dialog").hide()
        })

        //删除验证按钮
        $(document).off("click.delete").on("click.delete", "#luckysheet-dataVerification-dialog-delete", function (e) {
            let rangeTxt = $("#luckysheet-dataVerification-dialog #data-verification-range input").val().trim()
            let range = _this.getRangeByTxt(rangeTxt)

            if (range.length == 0) {
                tooltip.info('<i class="fa fa-exclamation-triangle"></i>', dvText.selectCellRange2)
                return
            }

            let historyDataVerification = $.extend(true, {}, _this.dataVerification)
            let currentDataVerification = $.extend(true, {}, _this.dataVerification)

            let str = range[range.length - 1].row[0],
                edr = range[range.length - 1].row[1],
                stc = range[range.length - 1].column[0],
                edc = range[range.length - 1].column[1]

            for (let r = str; r <= edr; r++) {
                for (let c = stc; c <= edc; c++) {
                    delete currentDataVerification[r + '_' + c]
                }
            }

            _this.ref(historyDataVerification, currentDataVerification, Store.currentSheetIndex)

            $("#luckysheet-modal-dialog-mask").hide()
            $("#luckysheet-dataVerification-dialog").hide()
        })

        //info提示弹框 关闭
        $(document).on("click", "#luckysheet-info .luckysheet-modal-dialog-title-close, #luckysheet-info .luckysheet-model-close-btn", function (e) {
            $(this).parents("#luckysheet-info").hide()

            if ($("#luckysheet-dataVerification-dialog").is(":visible")) {
                $("#luckysheet-modal-dialog-mask").show()
            }
            e.stopPropagation()
        })
    },
    dataAllocation: function () {
        let _this = this

        //单元格范围
        let range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]
        let rangeTxt = getRangetxt(Store.currentSheetIndex, range, Store.currentSheetIndex)
        $("#luckysheet-dataVerification-dialog #data-verification-range input").val(rangeTxt)

        //focus单元格
        let rowIndex = range.row_focus || range.row[0]
        let colIndex = range.column_focus || range.column[0]
        let dataVerification = $.extend(true, {}, _this.dataVerification)
        let item = dataVerification[rowIndex + '_' + colIndex]

        if (item == null) {
            item = $.extend(true, {}, _this.defaultItem)
        }

        _this.curItem = item

        //验证条件
        $("#luckysheet-dataVerification-dialog #data-verification-type-select").val(item.type)
        $("#luckysheet-dataVerification-dialog .show-box .show-box-item").hide()

        if (item.type == 'dropdown') {
            $("#luckysheet-dataVerification-dialog .show-box .show-box-item-dropdown").show()
            $("#luckysheet-dataVerification-dialog .show-box-item-dropdown .data-verification-value1").val(item.value1)
            $('#luckysheet-dataVerification-dialog #data-verification-multi').prop('checked', item.type2 ? true : false)
        }
        else if (item.type == 'checkbox') {
            $("#luckysheet-dataVerification-dialog .show-box .show-box-item-checkbox").show()
            $("#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value1").val(item.value1)
            $("#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value2").val(item.value2)
        }
        else if (item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal') {
            $("#luckysheet-dataVerification-dialog .show-box-item-number").show()
            $("#luckysheet-dataVerification-dialog #data-verification-number-select").val(item.type2)
            $("#luckysheet-dataVerification-dialog .show-box-item-number .input").hide()

            if (item.type2 == 'bw' || item.type2 == 'nb') {
                $("#luckysheet-dataVerification-dialog .show-box-item-number .input1").show()
            }
            else {
                $("#luckysheet-dataVerification-dialog .show-box-item-number .input2").show()
            }

            $("#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value1").val(item.value1)
            $("#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value2").val(item.value2)
        }
        else if (item.type == 'text_content') {
            $("#luckysheet-dataVerification-dialog .show-box-item-text").show()
            $("#luckysheet-dataVerification-dialog #data-verification-text-select").val(item.type2)
            $("#luckysheet-dataVerification-dialog .show-box-item-text .data-verification-value1").val(item.value1)
        }
        else if (item.type == 'text_length') {
            $("#luckysheet-dataVerification-dialog .show-box-item-textLength").show()
            $("#luckysheet-dataVerification-dialog #data-verification-textLength-select").val(item.type2)
            $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input").hide()

            if (item.type2 == 'bw' || item.type2 == 'nb') {
                $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input1").show()
            }
            else {
                $("#luckysheet-dataVerification-dialog .show-box-item-textLength .input2").show()
            }

            $("#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value1").val(item.value1)
            $("#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value2").val(item.value2)
        }
        else if (item.type == 'date') {
            $("#luckysheet-dataVerification-dialog .show-box-item-date").show()
            $("#luckysheet-dataVerification-dialog #data-verification-date-select").val(item.type2)
            $("#luckysheet-dataVerification-dialog .show-box-item-date .input").hide()

            if (item.type2 == 'bw' || item.type2 == 'nb') {
                $("#luckysheet-dataVerification-dialog .show-box-item-date .input1").show()
            }
            else {
                $("#luckysheet-dataVerification-dialog .show-box-item-date .input2").show()
            }

            $("#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value1").val(item.value1)
            $("#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value2").val(item.value2)
        }
        else if (item.type == 'validity') {
            $("#luckysheet-dataVerification-dialog .show-box .show-box-item-validity").show()
            $("#luckysheet-dataVerification-dialog #data-verification-validity-select").val(item.type2)
        }

        //自动远程获取选项
        $("#luckysheet-dataVerification-dialog #data-verification-remote").prop("checked", item.remote)

        //输入数据无效时禁止输入
        $("#luckysheet-dataVerification-dialog #data-verification-prohibitInput").prop("checked", item.prohibitInput)

        //选中单元格时显示提示语
        $("#luckysheet-dataVerification-dialog #data-verification-hint-show").prop("checked", item.hintShow)

        if (item.hintShow) {
            $("#luckysheet-dataVerification-dialog .data-verification-hint-text").show()
        }
        else {
            $("#luckysheet-dataVerification-dialog .data-verification-hint-text").hide()
        }

        $("#luckysheet-dataVerification-dialog .data-verification-hint-text input").val(item.hintText)
    },
    rangeDialog: function (dataSource, txt) {
        let _this = this

        const _locale = locale()
        const dvText = _locale.dataVerification
        const buttonText = _locale.button

        $("#luckysheet-modal-dialog-mask").hide()
        $("#luckysheet-dataVerificationRange-dialog").remove()

        $("body").append(replaceHtml(modelHTML, {
            "id": "luckysheet-dataVerificationRange-dialog",
            "addclass": "luckysheet-dataVerificationRange-dialog",
            "title": dvText.selectCellRange,
            "content": `<input readonly="readonly" placeholder="${dvText.selectCellRange2}" value="${txt}"/>`,
            "botton": `<button id="luckysheet-dataVerificationRange-dialog-confirm" class="btn btn-primary" data-source="${dataSource}">${buttonText.confirm}</button>
                        <button id="luckysheet-dataVerificationRange-dialog-close" class="btn btn-default">${buttonText.close}</button>`,
            "style": "z-index:100003"
        }))
        let $t = $("#luckysheet-dataVerificationRange-dialog")
            .find(".luckysheet-modal-dialog-content")
            .css("min-width", 300)
            .end(),
            myh = $t.outerHeight(),
            myw = $t.outerWidth()
        let winw = $(window).width(), winh = $(window).height()
        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop()
        $("#luckysheet-dataVerificationRange-dialog").css({
            "left": (winw + scrollLeft - myw) / 2,
            "top": (winh + scrollTop - myh) / 3
        }).show()
    },
    getTxtByRange: function (range) {
        if (range.length > 0) {
            let txt = []

            for (let s = 0; s < range.length; s++) {
                let r1 = range[s].row[0], r2 = range[s].row[1]
                let c1 = range[s].column[0], c2 = range[s].column[1]

                txt.push(getRangetxt(Store.currentSheetIndex, { "row": [r1, r2], "column": [c1, c2] }, Store.currentSheetIndex))
            }

            return txt.join(",")
        }
    },
    getRangeByTxt: function (txt) {
        let range = []

        if (txt.indexOf(",") != -1) {
            let arr = txt.split(",")
            for (let i = 0; i < arr.length; i++) {
                if (formula.iscelldata(arr[i])) {
                    range.push(formula.getcellrange(arr[i]))
                }
                else {
                    range = []
                    break
                }
            }
        }
        else {
            if (formula.iscelldata(txt)) {
                range.push(formula.getcellrange(txt))
            }
        }

        return range
    },
    cellFocus: function (r, c, clickMode) {
        $("#luckysheet-dataVerification-dropdown-btn").hide()
        $("#luckysheet-dataVerification-showHintBox").hide()

        let _this = this

        if (_this.dataVerification == null || _this.dataVerification[r + '_' + c] == null) {
            $("#luckysheet-dataVerification-dropdown-List").hide()
            return
        }

        let row = Store.visibledatarow[r],
            row_pre = r == 0 ? 0 : Store.visibledatarow[r - 1]
        let col = Store.visibledatacolumn[c],
            col_pre = c == 0 ? 0 : Store.visibledatacolumn[c - 1]

        let margeset = menuButton.mergeborer(Store.flowdata, r, c)
        if (!!margeset) {
            row = margeset.row[1]
            row_pre = margeset.row[0]

            col = margeset.column[1]
            col_pre = margeset.column[0]
        }

        let item = _this.dataVerification[r + '_' + c]

        //单元格数据验证 类型是 复选框
        if (clickMode && item.type == 'checkbox') {
            _this.checkboxChange(r, c)
            return
        }

        //单元格数据验证 类型是 下拉列表
        if (item.type == 'dropdown') {
            $("#luckysheet-dataVerification-dropdown-btn").show().css({
                'max-width': col - col_pre,
                'max-height': row - row_pre,
                'left': col - 20,
                'top': row_pre + (row - row_pre - 20) / 2
            })

            if ($("#luckysheet-dataVerification-dropdown-List").is(":visible")) {
                let dataIndex = $("#luckysheet-dataVerification-dropdown-List").prop("data-index")

                if (dataIndex != (r + '_' + c)) {
                    $("#luckysheet-dataVerification-dropdown-List").hide()
                }
            }
        }
        else {
            $("#luckysheet-dataVerification-dropdown-List").hide()
        }

        //提示语
        if (item.hintShow) {
            let hintText

            if (Store.lang == 'en') {
                hintText = '<span style="color:#f5a623;">Hint: </span>'
            }
            else {
                hintText = '<span style="color:#f5a623;">提示：</span>'
            }

            hintText += _this.getHintText(item)

            $("#luckysheet-dataVerification-showHintBox").html(hintText).show().css({
                'left': col_pre,
                'top': row
            })

            return
        }

        //数据验证未通过
        let cellValue = getcellvalue(r, c, null)

        if (isRealNull(cellValue)) {
            return
        }

        let validate = _this.validateCellData(cellValue, item)

        if (!validate) {
            let failureText

            if (Store.lang == 'en') {
                failureText = '<span style="color:#f72626;">Failure: </span>'
            }
            else {
                failureText = '<span style="color:#f72626;">失效：</span>'
            }

            failureText += _this.getFailureText(item)

            $("#luckysheet-dataVerification-showHintBox").html(failureText).show().css({
                'left': col_pre,
                'top': row
            })
        }
    },
    getHintText: function (item) {
        let _this = this

        let hintText = item.hintText || ''

        if (hintText.length == 0) {
            if (Store.lang == 'en') {
                if (item.type == 'dropdown') {
                    hintText += 'please select an option in the drop-down list'
                }
                else if (item.type == 'checkbox') {

                }
                else if (item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal') {
                    hintText += 'please enter a ' + _this.optionLabel_en[item.type] + ' ' + _this.optionLabel_en[item.type2] + ' ' + item.value1

                    if (item.type2 == 'bw' || item.type2 == 'nb') {
                        hintText += ' and ' + item.value2
                    }
                }
                else if (item.type == 'text_content') {
                    hintText += 'please enter text ' + _this.optionLabel_en[item.type2] + ' ' + item.value1
                }
                else if (item.type == 'text_length') {
                    hintText += 'please enter text with length ' + _this.optionLabel_en[item.type2] + ' ' + item.value1

                    if (item.type2 == 'bw' || item.type2 == 'nb') {
                        hintText += ' and ' + item.value2
                    }
                }
                else if (item.type == 'date') {
                    hintText += 'please enter a date ' + _this.optionLabel_en[item.type2] + ' ' + item.value1

                    if (item.type2 == 'bw' || item.type2 == 'nb') {
                        hintText += ' and ' + item.value2
                    }
                }
                else if (item.type == 'validity') {
                    hintText += 'please enter the correct ' + _this.optionLabel_en[item.type2]
                }
            }
            else {
                if (item.type == 'dropdown') {
                    hintText += '请选择下拉列表中的选项'
                }
                else if (item.type == 'checkbox') {

                }
                else if (item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal') {
                    hintText += '请输入' + _this.optionLabel[item.type2] + item.value1

                    if (item.type2 == 'bw' || item.type2 == 'nb') {
                        hintText += '和' + item.value2 + '之间'
                    }

                    hintText += '的' + _this.optionLabel[item.type]
                }
                else if (item.type == 'text_content') {
                    hintText += '请输入内容' + _this.optionLabel[item.type2] + item.value1 + '的文本'
                }
                else if (item.type == 'text_length') {
                    hintText += '请输入长度' + _this.optionLabel[item.type2] + item.value1

                    if (item.type2 == 'bw' || item.type2 == 'nb') {
                        hintText += '和' + item.value2 + '之间'
                    }

                    hintText += '的文本'
                }
                else if (item.type == 'date') {
                    hintText += '请输入' + _this.optionLabel[item.type2] + item.value1

                    if (item.type2 == 'bw' || item.type2 == 'nb') {
                        hintText += '和' + item.value2 + '之间'
                    }

                    hintText += '的日期'
                }
                else if (item.type == 'validity') {
                    hintText += '请输入正确的' + _this.optionLabel[item.type2]
                }
            }
        }

        return hintText
    },
    getFailureText: function (item) {
        let _this = this

        let failureText = ''

        if (Store.lang == 'en') {
            if (item.type == 'dropdown') {
                failureText += 'what you selected is not an option in the drop-down list'
            }
            else if (item.type == 'checkbox') {

            }
            else if (item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal') {
                failureText += 'what you entered is not a ' + _this.optionLabel_en[item.type] + ' ' + _this.optionLabel_en[item.type2] + ' ' + item.value1

                if (item.type2 == 'bw' || item.type2 == 'nb') {
                    failureText += ' and ' + item.value2
                }
            }
            else if (item.type == 'text_content') {
                failureText += 'what you entered is not text that ' + _this.optionLabel_en[item.type2] + ' ' + item.value1
            }
            else if (item.type == 'text_length') {
                failureText += 'the text you entered is not length ' + _this.optionLabel_en[item.type2] + ' ' + item.value1

                if (item.type2 == 'bw' || item.type2 == 'nb') {
                    failureText += ' and ' + item.value2
                }
            }
            else if (item.type == 'date') {
                failureText += 'the date you entered is not ' + _this.optionLabel_en[item.type2] + ' ' + item.value1

                if (item.type2 == 'bw' || item.type2 == 'nb') {
                    failureText += ' and ' + item.value2
                }
            }
            else if (item.type == 'validity') {
                failureText += 'what you entered is not a correct ' + _this.optionLabel_en[item.type2]
            }
        }
        else {
            if (item.type == 'dropdown') {
                failureText += '你选择的不是下拉列表中的选项'
            }
            else if (item.type == 'checkbox') {

            }
            else if (item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal') {
                failureText += '你输入的不是' + _this.optionLabel[item.type2] + item.value1

                if (item.type2 == 'bw' || item.type2 == 'nb') {
                    failureText += '和' + item.value2 + '之间'
                }

                failureText += '的' + _this.optionLabel[item.type]
            }
            else if (item.type == 'text_content') {
                failureText += '你输入的不是内容' + _this.optionLabel[item.type2] + item.value1 + '的文本'
            }
            else if (item.type == 'text_length') {
                failureText += '你输入的不是长度' + _this.optionLabel[item.type2] + item.value1

                if (item.type2 == 'bw' || item.type2 == 'nb') {
                    failureText += '和' + item.value2 + '之间'
                }

                failureText += '的文本'
            }
            else if (item.type == 'date') {
                failureText += '你输入的不是' + _this.optionLabel[item.type2] + item.value1

                if (item.type2 == 'bw' || item.type2 == 'nb') {
                    failureText += '和' + item.value2 + '之间'
                }

                failureText += '的日期'
            }
            else if (item.type == 'validity') {
                if (item.type2 == 'regex') {
                    console.log('regex失效', item)
                    failureText += item.hintText
                } else {
                    failureText += '你输入的不是一个正确的' + _this.optionLabel[item.type2]
                }

            }
        }

        return failureText
    },
    validateCellData: function (cellValue, item) {
        let _this = this

        let type = item.type,
            type2 = item.type2,
            value1 = item.value1,
            value2 = item.value2,
            regex = item.regex || null



        if (type == 'dropdown') {
            let list = _this.getDropdownList(value1)

            // 多选的情况 检查每个都在下拉列表中
            if (type2 && cellValue) {
                return cellValue.split(',').every(function (i) {
                    return list.indexOf(i) !== -1
                })
            }

            let result = false

            for (let i = 0; i < list.length; i++) {
                if (list[i] == cellValue) {
                    result = true
                    break
                }
            }

            return result
        }
        else if (type == 'checkbox') {

        }
        else if (type == 'number' || type == 'number_integer' || type == 'number_decimal') {
            if (!isRealNum(cellValue)) {
                return false
            }

            cellValue = Number(cellValue)

            if (type == 'number_integer' && cellValue % 1 !== 0) {
                return false
            }

            if (type == 'number_decimal' && cellValue % 1 === 0) {
                return false
            }

            value1 = Number(value1)
            value2 = Number(value2)

            if (type2 == 'bw' && (cellValue < value1 || cellValue > value2)) {
                return false
            }

            if (type2 == 'nb' && (cellValue >= value1 && cellValue <= value2)) {
                return false
            }

            if (type2 == 'eq' && cellValue != value1) {
                return false
            }

            if (type2 == 'ne' && cellValue == value1) {
                return false
            }

            if (type2 == 'gt' && cellValue <= value1) {
                return false
            }

            if (type2 == 'lt' && cellValue >= value1) {
                return false
            }

            if (type2 == 'gte' && cellValue < value1) {
                return false
            }

            if (type2 == 'lte' && cellValue > value1) {
                return false
            }
        }
        else if (type == 'text_content') {
            cellValue = cellValue.toString()
            value1 = value1.toString()

            if (type2 == 'include' && cellValue.indexOf(value1) == -1) {
                return false
            }

            if (type2 == 'exclude' && cellValue.indexOf(value1) > -1) {
                return false
            }

            if (type2 == 'equal' && cellValue != value1) {
                return false
            }
        }
        else if (type == 'text_length') {
            cellValue = cellValue.toString().length

            value1 = Number(value1)
            value2 = Number(value2)

            if (type2 == 'bw' && (cellValue < value1 || cellValue > value2)) {
                return false
            }

            if (type2 == 'nb' && (cellValue >= value1 && cellValue <= value2)) {
                return false
            }

            if (type2 == 'eq' && cellValue != value1) {
                return false
            }

            if (type2 == 'ne' && cellValue == value1) {
                return false
            }

            if (type2 == 'gt' && cellValue <= value1) {
                return false
            }

            if (type2 == 'lt' && cellValue >= value1) {
                return false
            }

            if (type2 == 'gte' && cellValue < value1) {
                return false
            }

            if (type2 == 'lte' && cellValue > value1) {
                return false
            }
        }
        else if (type == 'date') {
            if (!isdatetime(cellValue)) {
                return false
            }

            if (type2 == 'bw' && (diff(cellValue, value1) < 0 || diff(cellValue, value2) > 0)) {
                return false
            }

            if (type2 == 'nb' && (diff(cellValue, value1) >= 0 && diff(cellValue, value2) <= 0)) {
                return false
            }

            if (type2 == 'eq' && diff(cellValue, value1) != 0) {
                return false
            }

            if (type2 == 'ne' && diff(cellValue, value1) == 0) {
                return false
            }

            if (type2 == 'bf' && diff(cellValue, value1) >= 0) {
                return false
            }

            if (type2 == 'nbf' && diff(cellValue, value1) < 0) {
                return false
            }

            if (type2 == 'af' && diff(cellValue, value1) <= 0) {
                return false
            }

            if (type2 == 'naf' && diff(cellValue, value1) > 0) {
                return false
            }
        }
        else if (type == 'validity') {
            if (type2 == 'card' && !validateIdCard(cellValue)) {
                return false
            }

            if (type2 == 'phone' && !/^1[3456789]\d{9}$/.test(cellValue)) {
                return false
            }

            if (type2 == 'regex' && !regexValidate(regex, cellValue)) {
                return false
            }
        }

        return true
    },




    dropdownListShow: function () {
        $("#luckysheet-dataVerification-showHintBox").hide()

        let _this = this

        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]
        let rowIndex = last.row_focus
        let colIndex = last.column_focus

        let row = Store.visibledatarow[rowIndex],
            row_pre = rowIndex == 0 ? 0 : Store.visibledatarow[rowIndex - 1]
        let col = Store.visibledatacolumn[colIndex],
            col_pre = colIndex == 0 ? 0 : Store.visibledatacolumn[colIndex - 1]

        let margeset = menuButton.mergeborer(Store.flowdata, rowIndex, colIndex)
        if (!!margeset) {
            row = margeset.row[1]
            row_pre = margeset.row[0]

            col = margeset.column[1]
            col_pre = margeset.column[0]
        }

        let item = _this.dataVerification[rowIndex + '_' + colIndex]
        let list = _this.getDropdownList(item.value1)

        let optionHtml = ''
        if (item.type === 'dropdown' && item.type2) {
            // 下拉多选的情况下 将已经选择的标出来
            let cellValue = getcellvalue(rowIndex, colIndex, null)
            let valueArr = isRealNull(cellValue) ? [] : cellValue.split(',')
            list.forEach(i => {
                let checked = valueArr.indexOf(i) !== -1
                optionHtml += `<div class="dropdown-List-item  luckysheet-mousedown-cancel multi${checked ? ' checked' : ''}">${i}</div>`
            })
        } else {
            list.forEach(i => {
                optionHtml += `<div class="dropdown-List-item luckysheet-mousedown-cancel">${i}</div>`
            })
        }

        $("#luckysheet-dataVerification-dropdown-List")
            .html(optionHtml)
            .prop("data-index", rowIndex + '_' + colIndex)
            .show()
            .css({
                'width': col - col_pre - 1,
                'left': col_pre,
                'top': row,
            })

        let myh = $("#luckysheet-dataVerification-dropdown-List").outerHeight()
        let currentWinH = $("#luckysheet-cell-main")[0].scrollHeight

        if (row + myh > currentWinH - 42 - 6) {
            $("#luckysheet-dataVerification-dropdown-List").css({
                'top': row_pre - myh,
            })
        }
    },
    getDropdownList: function (txt) {
        let list = []

        if (formula.iscelldata(txt)) {
            let range = formula.getcellrange(txt)
            let d = Store.luckysheetfile[getSheetIndex(range.sheetIndex)].data

            for (let r = range.row[0]; r <= range.row[1]; r++) {
                for (let c = range.column[0]; c <= range.column[1]; c++) {
                    if (d[r] == null) {
                        continue
                    }

                    let cell = d[r][c]

                    if (cell == null || cell.v == null) {
                        continue
                    }

                    let v = cell.m || cell.v

                    if (!list.includes(v)) {
                        list.push(v)
                    }
                }
            }
        }
        else {
            let arr = txt.split(",")

            for (let i = 0; i < arr.length; i++) {
                let v = arr[i]

                if (v.length == 0) {
                    continue
                }

                if (!list.includes(v)) {
                    list.push(v)
                }
            }
        }

        return list
    },
    checkboxChange: function (r, c) {
        let _this = this

        let historyDataVerification = $.extend(true, {}, _this.dataVerification)
        let currentDataVerification = $.extend(true, {}, _this.dataVerification)

        let item = currentDataVerification[r + '_' + c]
        item.checked = !item.checked

        let value = item.value2
        if (item.checked) {
            value = item.value1
        }

        let d = editor.deepCopyFlowData(Store.flowdata)
        setcellvalue(r, c, d, value)

        _this.refOfCheckbox(
            historyDataVerification,
            currentDataVerification,
            Store.currentSheetIndex,
            d,
            { "row": [r, r], "column": [c, c] }
        )
    },
    ref: function (historyDataVerification, currentDataVerification, sheetIndex) {
        let _this = this

        if (Store.clearjfundo) {
            Store.jfundo.length = 0

            let redo = {}
            redo["type"] = "updateDataVerification"
            redo["sheetIndex"] = sheetIndex
            redo["historyDataVerification"] = historyDataVerification
            redo["currentDataVerification"] = currentDataVerification
            Store.jfredo.push(redo)
        }

        _this.dataVerification = currentDataVerification
        Store.luckysheetfile[getSheetIndex(sheetIndex)].dataVerification = currentDataVerification

        //共享编辑模式
        if (server.allowUpdate) {
            server.saveParam("all", sheetIndex, currentDataVerification, { "k": "dataVerification" })
        }

        setTimeout(function () {
            luckysheetrefreshgrid()
        }, 1)
    },
    refOfCheckbox: function (historyDataVerification, currentDataVerification, sheetIndex, d, range) {
        let _this = this

        if (Store.clearjfundo) {
            Store.jfundo.length = 0

            let redo = {}
            redo["type"] = "updateDataVerificationOfCheckbox"
            redo["sheetIndex"] = sheetIndex
            redo["historyDataVerification"] = historyDataVerification
            redo["currentDataVerification"] = currentDataVerification
            redo["data"] = Store.flowdata
            redo["curData"] = d
            redo["range"] = range
            Store.jfredo.push(redo)
        }

        _this.dataVerification = currentDataVerification
        Store.luckysheetfile[getSheetIndex(sheetIndex)].dataVerification = currentDataVerification

        Store.flowdata = d
        editor.webWorkerFlowDataCache(Store.flowdata)//worker存数据
        Store.luckysheetfile[getSheetIndex(sheetIndex)].data = Store.flowdata

        //共享编辑模式
        if (server.allowUpdate) {
            server.saveParam("all", sheetIndex, currentDataVerification, { "k": "dataVerification" })
            server.historyParam(Store.flowdata, sheetIndex, range)
        }

        setTimeout(function () {
            luckysheetrefreshgrid()
        }, 1)
    },
}

// 正则验证
function regexValidate (regexString, cellValue) {
    if (!regexString || typeof regexString !== 'string') {
        return false
    }
    if (cellValue == null) {
        return false
    }
    try {
        let regex = new RegExp(regexString, "i")
        return regex.test(cellValue.toString())
    } catch (e) {
        console.warn('Invalid regex pattern:', regexString)
        return false
    }
}



function validateIdCard (idCard) {
    // 15位和18位身份证号码的正则表达式
    var regIdCard = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/

    // 如果通过该验证，说明身份证格式正确，但准确性还需计算
    if (regIdCard.test(idCard)) {
        if (idCard.length == 18) {
            var idCardWi = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2) // 将前17位加权因子保存在数组里
            var idCardY = new Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2) // 这是除以11后，可能产生的11位余数、验证码，也保存成数组
            var idCardWiSum = 0 // 用来保存前17位各自乖以加权因子后的总和
            for (var i = 0; i < 17; i++) {
                idCardWiSum += idCard.substring(i, i + 1) * idCardWi[i]
            }

            var idCardMod = idCardWiSum % 11 // 计算出校验码所在数组的位置
            var idCardLast = idCard.substring(17) // 得到最后一位身份证号码

            // 如果等于2，则说明校验码是10，身份证号码最后一位应该是X
            if (idCardMod == 2) {
                if (idCardLast == "X" || idCardLast == "x") {
                    return true
                } else {
                    return false
                }
            } else {
                // 用计算出的验证码与最后一位身份证号码匹配，如果一致，说明通过，否则是无效的身份证号码
                if (idCardLast == idCardY[idCardMod]) {
                    return true
                } else {
                    return false
                }
            }
        }
    } else {
        return false
    }
}

export default dataVerificationCtrl